#!/bin/bash
# /opt/nginx/sbin/nginx -V查看nginx编译时的尝试
#ps -ef |grep nginx查看nginx进程（master和worker)
# 备份二进制文件
\cp -f /opt/nginx/sbin/nginx{,.bak}
# 取出master进程pid命令 ps -ef|grep nginx|grep master|awk '{print $2}'
# 注意，若在docker里，nginx的master进程默认为1，不能使用上面的命令取
origin_master_pid=`ps -ef|grep nginx|grep master|awk '{print $2}'`
# 发送SIGUSR2信号给master进程，会自动将原先的/opt/nginx/log/下的nginx.pid命名为nginx.pid.oldbin，并新起一个nginx.pid
# cat nginx.pid.oldbin发现是旧的master进程的pid，此时查看nginx进程发现有两个master和worker进程
kill -s SIGUSR2 $origin_master_pid
# 发送SIGWINCH退出原先的worker进程，此时旧的master进程还在，便于回滚，如果后面有问题可以用该master进程回滚
kill -s SIGWINCH $origin_master_pid
new_master_pid=`ps -ef|grep nginx|grep master|awk '{print $2}' |grep -v $origin_master_pid`

# 如果新nginx没问题，则退出原先的master进程，此时只剩下新的master和worker进程
kill -s SIGQUIT $origin_master_pid
# 如果新的nginx有问题，发送SIGHUP给原先的master进程，此时会起原先的master的worker进程
kill -s SIGHUP $origin_master_pid
kill -s SIGQUIT $new_master_pid
